概率编程¶

贝叶斯统计的概念很简单, 我们有一些固定的数据(固定的意思是指我们无法改变观测值),和一些感兴趣的参数, 剩下要做的就是探索这些参数可能的取值, 其中所有的不确定性都通过概率进行建模。 在别的统计学范式中, 未知量有多种不同的表示方式, 而在贝叶斯的框架中, 所有未知量都是同等对待的, 如果不知道某个变量, 我们就给其赋予一个概率分布。

因此, 贝叶斯定理就是将先验概率分布 $p(\theta)$ (在观测到数据之前我们对问题的理解) 转化成后验分布 $p(\theta \mid D)$ (观测到数据之后所得到的信息), 换句话说, 贝叶斯统计就是一种机器学习的过程。

尽管概念上很简单, 纯粹的概率模型得到的表达式通常分析起来很棘手。许多年来, 这都是一个问题, 大概也是影响贝叶斯方法广泛应用的最大原因之一。随着计算时代的到来, 数值化方法的发展使得计算几乎任意模型的后验成为了可能, 这极大地促进了贝叶斯方法的应用。我们可以把这些数值化方法当作通用引擎, 按照 PyMC3 的核心开发者之一 Thomas Wiecki 的说法, 只需要按下按钮, 推断部分就可以自动完成了。

自动化推断促进了概率编程语言的发展, 从而使得模型构建和推断相分离。 在概率编程语言的框架中, 用户只需要寥寥数行代码描述概率模型, 后面的推断过程就能自动完成了。概率编程使得人们能够更快速地构建复杂的概率模型并减少出错的可能, 可以预见, 这将给数据科学和其他学科带来极大的影响。

推断引擎¶

即便某些情况下不太可能从分析的角度得到后验, 我们也有办法将后验计算出来, 其中一些方法列举如下。 (1) 非马尔科夫方法:

  • 网格计算;
  • 二次近似;
  • 变分方法

(2) 马尔科夫方法:

  • Metropolis-Hastings 算法;
  • 汉密尔顿蒙特卡洛方法 (Hamiltonian Monte Carlo) /不掉向采样 (No UTurn Sampler, NUTS)。

如今, 贝叶斯分析主要是通过马尔科夫链蒙特卡洛 (Markov Chain Monte Carlo, MCMC)方法进行, 同时变分方法也越来越流行, 特别是在一些较大的数据集上。学习贝叶斯分析并不需要完全掌握这些方法, 不过从概念层面上对它们的工作原理有一定了解会很有帮助, 比如调试模型。

非马尔科夫方法¶

我们首先讨论基于非马尔科夫方法的推断引擎。非马尔科夫方法在低维的问题要比马尔科夫方法更快, 对于某些问题, 这类方法非常有用, 而对另外一些问题, 这类方法只能提供真实后验的粗略近似, 不过没关系, 它们可以为马尔科 夫方法提供一个不错的初始点, 后面我们会介绍马尔科夫的含义。

网格计算¶

网格计算是一种暴力穷举的方法。即便你无法计算出整个后验, 你也可以根 据一些点计算出先验和似然。 假设我们要计算某个单参数模型的后验, 网格近似可以按照如下方式进行:

  • 确定参数的一个合理区间(先验会给你点提示);
  • 在以上区间确定一些网格点(通常是等距离的);
  • 对于网格中的每个点计算先验和似然。

视情况, 我们可能会对计算结果进行归一化(把每个点的计算结果除以所有 点的计算结果之和)。 很容易看出, 选的点越多 (网格越密) 近似的结果就越好。事实上, 如果使用无限多的点, 我们可以得到准确的后验。 网格计算的方法不能很好地适用于多参数(又或者称多维度) 的场景。随着参数的增加, 采样空间相比后验空间会急剧增加,换言之,我们花费了大量时间计算后验值,但对于估计后验却几乎没有帮助。

二次近似¶

二次近似, 也称拉普拉斯方法或者正态近似,利用的是高斯分布来近似后验。该方法通常很有效, 原因是后验分布众数附近的区域通常是服从正态分布的, 事实上很多情况下就是高斯分布。二次近似的计算过程分为两步。首先, 找出后验分布的峰值, 该值可以通过一些最优化算法得到 (有许多开箱即用的算法用来求解函数的最大值或最小值), 这样我们得到了用来近似的高斯分布的均值; 然后估计函数在众数附近的曲率, 根据该曲率可以得出近似高斯分布的标准差。

变分方法¶

现代的贝叶斯统计学大多都采用马尔科夫方法 (下一节会介绍), 不过该方法对某些问题求解很慢而且不能很好地并行计算。一种简单的做法是同时运行多 个马尔科夫链, 然后将结果合并, 不过对大多数问题而言这并不是一个合适的解决方案, 如何找到有效的并行论算方式是当前的一个研究热点。

对于较大的数据集或是某些计算量很大的似然而言, 变分方法是一个更好的选择。此外, 这类方法能快速得到后验的近似, 为 MCMC 方法提供初始点。

变分方法的基本思想是用一个更简单的分布去近似后验, 这听起来有点像拉普拉斯近似, 不过深入细节你会发现二者有很大不同。变分方法的最大缺点是我们必须对每个模型设计一个特定的算法, 因而变分方法并不是一个通用的推断 擎, 而是与模型相关的。

当然, 许多人都在尝试将变分方法自动化。最近提出的一个方法是自动 差分变分推断 (Automatic Differentiation Variational Inference, ADVI) (查看 http://arxiv.org/abs/1603.00788 了解更多)。从概念层面上讲, ADVI 是按下面步骤工作的。

  1. 对参数进行变换从而使得它们位于整个实轴上。例如, 假设一个参数限定为正数, 对其求 $\log$ 后得到的值位于无界区间 $[-\infty,+\infty]$ 内。

  2. 用高斯分布对无界参数近似。需要注意, 转换后参数空间里的高斯分布在原来参数空间内是非高斯的,这也是与拉普拉斯近似方法的不同点。

  3. 采用某种优化算法使得高斯近似的结果尽可能接近后验, 该过程通过最大化证据下界 (Evidence Lower Bound, ELBO)实现。如何衡量两个分布的相似 性以及证据下界的具体含义都是一些数学细节。

参考资料:

  • 奥斯瓦尔多·马丁《Python贝叶斯分析》

In [ ]: